#pragma once
#include <SimpleDef.h>
extern int g_VideoTextModeColor;
#define NOT_FROM_C_UNITS 
#include <Memory/Paging.h>
/* 最小分段机制 */
// NOT_FROM_C_UNITS extern GlobalDescriptor s_GDT[256]; /* 全局描述符表 */
/* 中断处理 */
// NOT_FROM_C_UNITS extern IntGateDescriptor s_IDT[256]; /* 中断描述符表 */
extern void (*g_aIntExceptEntrypoint[34])(void); /* 中断入口函数 */
/* 内存管理 */
/* 原始内存信息，这部分内容继承自引导加载器 */
#include <Memory/Primitive.h>
extern DWORD_PTR g_dwlpPrimitiveMemoryPool; /* 物理内存池的物理基址，类型有意设置为 DWORD_PTR 而非 LPVOID */
#define KERNEL_VIDEO_COLOR_SIZE (0x10000) /* 彩色显存大小 */
#define KERNEL_VIDEO_BLKWHT_SIZE (0x8000) /* 黑白显存大小 */
#define KERNEL_VIDEO_TEXT_MODE_SIZE (0x8000) /* 8025 文本大小 */
extern AddressRangeDescriptor g_MemoryAddressMap[64]; /* 内存地址图 */
extern WORD g_VideoTextModeMemory[KERNEL_VIDEO_TEXT_MODE_SIZE / sizeof(WORD)]; /* 8025 显存 */
extern WORD g_VideoColorMemory[KERNEL_VIDEO_COLOR_SIZE / sizeof(WORD)]; /* 彩色显存 */
extern WORD g_VideoBlackWhiteMemory[KERNEL_VIDEO_BLKWHT_SIZE / sizeof(WORD)]; /* 黑白显存 */
/* 分页管理 */
#define PRIMITIVE_MEMORY_BITMAP_SIZE (((16 * 1024 * 1024) / 4096) / 32) /* 原始内存位图大小 */
extern DWORD g_bmPrimitiveMemoryPool[PRIMITIVE_MEMORY_BITMAP_SIZE]; /* 原始内存池的位图 */
extern DWORD g_dwMemoryPoolBitmapSearchIndex; /* 用于加快查找速度的索引 */
#define USER_PAGE_TABLE_ENTRY_COUNT (768 * 1024) /* 用户逻辑页表表项数 */
#define KERNEL_PAGE_TABLE_ENTRY_COUNT (254 * 1024) /* 内核逻辑页表表项数 */
extern PageTableEntry g_SlavePageTable[1024][1024]; /* 用户页表 */
extern PageTableEntry g_MasterPageTable[1024][1024]; /* 内核页表 */
/* 堆内存管理 */
#include <Memory/Heap.h>
extern LPArenaDescriptorTable g_lpKernelHeap; /* 内核堆 */
#include <ProcessThread/ProcessThread.h>
extern ProcessControlBlock g_ProcessTree; /* 进程树 */
extern LPTCBQUEUE g_lpReadyTCBQueue; /* 就绪态线程 */
extern LPTCBQUEUE g_lpSuspendedTCBQueue; /* 挂起态线程 */
extern LPTCBQUEUE g_lpTerminatedTCBQueue; /* 结束的线程 */
extern LPThreadControlBlock g_lpTerminatedThreadList; /* 结束的线程 */
#include <FileSystem/FAT32.h>
extern FAT32BPBHEADER g_BPB;
extern FileControlBlock g_FCBCache;
#include <IO/Keyboard.h>
extern LPKeyboardInputBuffer g_lpKeyboardInputBuffer;